ActiveForm a pohyb kurzoru

Otázka od: jan.slama@t-email.cz

1. 11. 2002 3:09

Zdravim vas,

Vytvarim modularni aplikaci, kazdy modul je jedno OCX s ActiveForm. Tyto
ActiveFormy pak vkladam dynamicky do zalozek na formulari.

Vse funguje dobre az na "maly" detail. Uvnitr ActivFormu nefunguji v editacnich
polich SIPKY DOLEVA A DOPRAVA!!!, klavesa TAB a posun koleckem mysi u
scrollbaru.

Bohuzel tuto vlastnost jsem zjistil az uz jsem mel vse navrzeno jako COM a
ActiveX. Tato zdanliva malickost bude pro uzivatele naprosto zasadni a urcite
me "s aplikaci, kde nefunguje ani pohyb kurzoru" posle do haje (a nebude ho
zajimat, ze je to koncepcne navrzene pomoci technologie COM)

Muzete mi nejak poradit, setkali jste se s tim? V archivu konference jsem nasel
nejake zminky o podobnem problemu (Petr Vones), ale myslim, ze se to tenkrat
nejak uspokojive nevyresilo. Neprisli jste od te doby na neco?

Diky za vase napady, Honza Slama

Odpovedá: Zbysek Hlinka

1. 11. 2002 8:30

On 1 Nov 2002 at 2:42, jan.slama@t-email.cz wrote:

> Vytvarim modularni aplikaci, kazdy modul je jedno OCX s ActiveForm.
> Tyto ActiveFormy pak vkladam dynamicky do zalozek na formulari.

Myslim, ze by bylo lepsi, kdyby si COM otevrel sve vlastni okno,
misto vkladani do okna ciziho.

S pozdravem

Zbysek Hlinka
E-mail: hlinka@hlinka.cz, localizator@localizator.com
Phone: +420 603 551 282

Odpovedá: Alexandr Stefek

1. 11. 2002 10:40

>
> Vse funguje dobre az na "maly" detail. Uvnitr ActivFormu nefunguji v
editacnich polich SIPKY DOLEVA A DOPRAVA!!!, klavesa TAB a posun koleckem
mysi u scrollbaru.
>
Nejdrive vytvoreni AcX za behu pod FActiveFormX: TActiveFormX;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FActiveFormX := TActiveFormX.Create(Self);
  FActiveFormX.Parent := Self;
  FActiveFormX.Left := 10;
  FActiveFormX.Align := alClient;

  FActiveFormX.TabStop := True;
end;

a nyni specialni zpracovani zprav zavesene na TApplicationEvents:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var
  OleInPlaceActiveObject: IOleInPlaceActiveObject;
begin
  if Msg.message = WM_KEYDOWN then begin
    if Msg.wParam in [9, 37..40] then begin
      OleInPlaceActiveObject := FActiveFormX.DefaultInterface as
IOleInPlaceActiveObject;
      OleInPlaceActiveObject.TranslateAccelerator(Msg);
    end;
    if Screen.ActiveControl = FActiveFormX then
      Handled := Msg.wParam in [9, 37..40]
    else
      Handled := Msg.wParam in [37..40];
  end;
end;

Ale je to takove moc rychle, urcite to pujde udelat lepe, nicmene je to
celkem
rychle reseni nouzove situace.

Alexandr STEFEK